

// 函数的类型  => 对函数的形参和返回值进行类型限制

// 在 JavaScript 中，有两种常见的定义函数的方式——函数声明（Function Declaration）和函数表达式（Function Expression）：
// 函数声明 => 命名函数
// function add(a,b){
//     return a + b;
// }

// 函数表达式  => 匿名函数
// let add = function(a,b){
//     return a + b;
// }


// 注意，输入多余的（或者少于要求的）参数，是不被允许的：
// 一个函数有输入和输出，要在 TypeScript 中对其进行约束，需要把输入和输出都考虑到 (形参和返回值)，其中函数声明的类型定义较简单 
// function add(a:number,b:number):number{
//     return a + b;
// }
// add(1,2,3)


// 函数表达式  
// 1. 写法时可以的  => 函数表达式(匿名函数赋值时) -> 对add这个变量没有添加修饰
// let add = function(a:number,b:number):number{
//     return a + b;
// }

// 1.1 
// let add: (a:number,b:number)=> number = function(a:number,b:number):number{
//     return a + b;
// }

// let  add: (a:number,b:number)=> number;  // 先声明
// add = function(a:number,b:number):number{ //在赋值
//     return a + b;
// }


// 用接口定义函数的形状
// interface AddFn {
//     (a:number,b:number):number
// }

// let  add: AddFn;  // 先声明
// add = function(a:number,b:number):number{ //在赋值
//     return a + b;
// }



// 可选参数 
// 1. 可选参数需要放在必选参数之后
// 2. 如果给该参数设置默认值 => 该参数或默认转化为可选参数

// 默认情况下,函数被调用时输入多余的（或者少于要求的）参数，是不被允许的：(可选参数除外)
// function add(a:number,b:number):number{
//     return a + b;
// }
// add(1,2,3)

// function add(a:number,b:number,c?:number):number{
//     if(c){
//         return a + b + c;
//     }else{
//         return a + b;
//     }
// }
// add(1,2)


// 参数默认值 (如果给该参数设置默认值 => 该参数或默认转化为可选参数)
// function add(a:number,b:number,c:number=0):number{
//     return a + b + c;
// }
// add(1,2,3)



// 剩余参数

// 两个参数
// function add(a,b){  // a => 1  b => 2
//     return a + b;
// }
// add(1,2)

// 任意n个数之和?

// var list = [1,2,3];
// console.log(...list);


// 剩余参数
// function add(...list:number []){ // ...list = 1,4,7,2,5,8,3,6,9 
//     return list.reduce((prev,item)=> prev+item,0);
// }

// add(1,4,7,2,5,8,3,6,9);


// 重载

// 数字或字符串反转 -> 方法期望:传入数字=>返回数字  传入字符串=>返回字符串
// function reverse(x: number | string): number | string | void {
//     if (typeof x === 'number') { // 123
//         return Number(x.toString().split('').reverse().join(''));
//     } else if (typeof x === 'string') {
//         return x.split('').reverse().join('');
//     }
// }

// 注意，TypeScript 会优先从最前面的函数定义开始匹配，所以多个函数定义如果有包含关系，需要优先把精确的定义写在前面。
function reverse(x: number): number;
function reverse(x: string): string;
function reverse(x: number | string): number | string | void {
    if (typeof x === 'number') { // 123
        return (x.toString().split('').reverse().join(''));
    } else if (typeof x === 'string') {
        return x.split('').reverse().join('');
    }
}

reverse(123);

























export default {}